import WebSocket from 'ws'
import { getWindow } from './windowProxy'

let ws = null
let wsUrl = null
let mainWindowsSender = null
let needReconnect = true
let maxReConnectTimes = 5
let lockReconnect = false

/**
 * 初始化ws
 * @param{{token:string}} config   token
 * @param{Electron.WebContents} _sender  发送消息的窗口
 * @param wsIp ws服务器地址
 */
const initWs = (config, _sender, wsIp) => {
  wsUrl = wsIp
  wsUrl = `${wsUrl}?token=${config.token}`
  mainWindowsSender = _sender
  createWs()
}
const closeWs = () => {
  needReconnect = false
  ws.close()
}

const createWs = () => {
  if (wsUrl == null) {
    return
  }
  ws = new WebSocket(wsUrl)
  ws.onopen = function () {
    console.log('WS 连接成功')
    ws.send('heart beat')
    maxReConnectTimes = 5
  }

  // 从服务器接受到信息时的回调函数
  ws.onmessage = async function (e) {
    let mainWindow = getWindow('main')
    //信息消息闪烁
    if (!mainWindow.isFocused()) {
      mainWindow.flashFrame(true)
    }
    console.log('收到ws服务器消息', e.data)
    const message = JSON.parse(e.data)
    // const extendData = message.extendData
    const messageType = message.messageType
    if (messageType === 7) {
      //异地登录 强制下线
      //发送消息退出
      mainWindowsSender.send('loginError', '账号在别处登录，点击确定退出登录')
      closeWs() //关闭ws连接
    } else if (messageType === 4) {
      // 好友申请
      // 发送消息 好友申请
      mainWindowsSender.send('friendApply', message.extendData)
    } else if (messageType === 1) {
      // 更新联系人信息
      // 更新联系人信息
      mainWindowsSender.send('updateContactList')
    }else if (messageType === 101) {
      mainWindowsSender.send('updateContactList', message.extendData)
    } else if (messageType === 2) {
      // 文本消息
      mainWindowsSender.send('receiveMessages', message)
    } else if (messageType === 201) {
      //图片
      mainWindowsSender.send('receiveMessages', message)
    } else if (messageType === 202) {
      //视频
    } else if (messageType === 203) {
      //文件
    } else if (messageType === 204) {
      //语音
    } else if (messageType === 205) {
      //未知
    }

    // case 0://ws链接成功
    // case 6://文件上传完成
    // case 10://修改群昵称

    // case 3://群创建成功
    // case 9://好友加入群组
    // case 5://图片，视频消息
    // case 8://解散群聊
    // case 11://退出群聊
    // case 12://踢出群聊
    // case 101://添加新的联系人
  }

  // 连接关闭后的回调函数存储数据
  ws.onclose = function () {
    console.log('关闭客户端连接准备重连')
    reconnect('onclose')
  }

  // 连接失败后的回调函数
  ws.onerror = function () {
    console.log('连接失败了准备重连')
    reconnect('onerror')
  }

  const reconnect = (type) => {
    if (!needReconnect) {
      console.log('链接断开无须重连')
      return
    }
    if (ws != null) {
      ws.close()
    }
    if (lockReconnect) {
      return
    }
    console.log(type + '准备重连')
    lockReconnect = true
    if (maxReConnectTimes > 0) {
      console.log('准备重连，剩余重连次数' + maxReConnectTimes, new Date().getTime())
      maxReConnectTimes--
      // 进行重连
      setTimeout(function () {
        createWs()
        lockReconnect = false
      }, 5000)
    } else {
      console.log('TCP连接已超时')
    }
  }

  //发送心跳
  setInterval(() => {
    if (ws != null && ws.readyState === 1) {
      ws.send('heart beat')
    }
  }, 1000 * 5)
}

export default {
  initWs,
  closeWs
}
